package com.kurt.repository;

import com.kurt.entity.SysMenu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 菜单Repository接口
 * 提供菜单数据访问方法
 */
@Repository
public interface SysMenuRepository extends JpaRepository<SysMenu, Long>, JpaSpecificationExecutor<SysMenu> {

    /**
     * 根据父菜单ID查找子菜单列表
     *
     * @param parentId 父菜单ID
     * @return 子菜单列表
     */
    List<SysMenu> findByParentIdOrderBySortOrderAsc(Long parentId);

    /**
     * 根据状态查找菜单列表
     *
     * @param status 状态
     * @return 菜单列表
     */
    List<SysMenu> findByStatusOrderBySortOrderAsc(Integer status);

    /**
     * 根据菜单类型查找菜单列表
     *
     * @param type 菜单类型
     * @return 菜单列表
     */
    List<SysMenu> findByTypeOrderBySortOrderAsc(Integer type);

    /**
     * 根据菜单ID列表查找菜单
     *
     * @param menuIds 菜单ID列表
     * @return 菜单列表
     */
    List<SysMenu> findByIdIn(List<Long> menuIds);

    /**
     * 根据角色ID查找菜单列表
     * 通过角色菜单关联表查询
     *
     * @param roleId 角色ID
     * @return 菜单列表
     */
    @Query("SELECT m FROM SysMenu m WHERE m.id IN (SELECT rm.menuId FROM SysRoleMenu rm WHERE rm.roleId = :roleId) ORDER BY m.sortOrder ASC")
    List<SysMenu> findByRoleId(@Param("roleId") Long roleId);

    /**
     * 根据用户ID查找菜单列表（通过角色关联）
     * 通过用户角色和角色菜单关联表查询
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    @Query("SELECT DISTINCT m FROM SysMenu m " +
            "WHERE m.id IN (SELECT rm.menuId FROM SysRoleMenu rm " +
            "WHERE rm.roleId IN (SELECT ur.roleId FROM SysUserRole ur WHERE ur.userId = :userId)) " +
            "ORDER BY m.sortOrder ASC")
    List<SysMenu> findByUserId(@Param("userId") Long userId);

    /**
     * 查找根菜单（父ID为0）
     *
     * @return 根菜单列表
     */
    List<SysMenu> findByParentIdAndStatusOrderBySortOrderAsc(Long parentId, Integer status);

    /**
     * 统计菜单下的子菜单数量
     *
     * @param parentId 父菜单ID
     * @return 子菜单数量
     */
    long countByParentId(Long parentId);

    /**
     * 根据父菜单ID查找子菜单列表
     *
     * @param parentId 父菜单ID
     * @return 子菜单列表
     */
    List<SysMenu> findByParentId(Long parentId);

    /**
     * 根据菜单名称查找菜单
     *
     * @param name 菜单名称
     * @return 菜单信息
     */
    Optional<SysMenu> findByName(String name);

    /**
     * 根据菜单编码查找菜单
     *
     * @param code 菜单编码
     * @return 菜单信息
     */
    Optional<SysMenu> findByCode(String code);

    /**
     * 根据菜单名称和ID查找菜单（排除指定ID）
     *
     * @param name 菜单名称
     * @param id   排除的菜单ID
     * @return 菜单信息
     */
    Optional<SysMenu> findByNameAndIdNot(String name, Long id);

    /**
     * 根据菜单编码和ID查找菜单（排除指定ID）
     *
     * @param code 菜单编码
     * @param id   排除的菜单ID
     * @return 菜单信息
     */
    Optional<SysMenu> findByCodeAndIdNot(String code, Long id);
}
